home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994…tember: Reference Library / Dev.CD Sep 94.toast / Periodicals / develop / develop Issue 6 / develop 6 code / TCP / NewsWatcher / NewsWatcher 2.0d15 source / source / menus.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-10  |  6.5 KB  |  205 lines  |  [TEXT/KAHL]

  1. /*----------------------------------------------------------------------------
  2.  
  3.     menus.c
  4.  
  5.     This module handles adjusting menus.
  6.     
  7.     Portions copyright © 1990, Apple Computer.
  8.     Portions copyright © 1993, Northwestern University.
  9.  
  10. ----------------------------------------------------------------------------*/
  11.  
  12. #include "glob.h"
  13. #include "menus.h"
  14. #include "util.h"
  15.  
  16.  
  17.  
  18. /*----------------------------------------------------------------------------
  19.     AdjustOneMenu
  20.     
  21.     Adjusts the state of a single menu.
  22.     
  23.     Entry:    menuID = menu id of menu to adjust.
  24.             numCommands = number of commands in menu.
  25.             *oldStatePtr = old menu enable/disable flags.
  26.             newState = new menu enable/disable flags.
  27.             
  28.     Exit:    function result = true if menu bar must be redrawn.
  29.             *oldStatePtr = updated menu enable/disable flags.
  30. ----------------------------------------------------------------------------*/
  31.  
  32. static Boolean AdjustOneMenu (short menuID, short numCommands,
  33.     unsigned long *oldStatePtr, unsigned long newState)
  34. {
  35.     unsigned long x, y, oldState;
  36.     Boolean mustRedraw = false;
  37.     short i;
  38.     MenuHandle theMenu;
  39.  
  40.     theMenu = GetMHandle(menuID);
  41.     oldState = *oldStatePtr;
  42.     if (oldState == newState) return false;
  43.     if ((newState & 1) == 0) {
  44.         if ((oldState & 1) == 0) return false;
  45.         DisableItem(theMenu, 0);
  46.         *oldStatePtr &= 0xfffffffe;
  47.         return true;
  48.     }
  49.     if ((oldState & 1) == 0) {
  50.         EnableItem(theMenu,0);
  51.         mustRedraw = true;
  52.     }
  53.     x = oldState;
  54.     y = newState;
  55.     for (i = 1 ; i <= numCommands; i++) {
  56.         x >>= 1;
  57.         y >>= 1;
  58.         if ((x & 1) != (y & 1)) {
  59.             if ((y & 1) == 0) {
  60.                 DisableItem(theMenu, i);
  61.             } else {
  62.                 EnableItem(theMenu, i);
  63.             }
  64.         }
  65.     }
  66.     *oldStatePtr = newState;
  67.     return mustRedraw;
  68. }
  69.  
  70.  
  71.  
  72. /*----------------------------------------------------------------------------
  73.     SetMenusTo
  74.     
  75.     Sets the menus to a given state.
  76.     
  77.     Entry:    newAppleMenuEnabled = true if Apple menu should be enabled, 
  78.                 false if disabled.
  79.             newFileMenuState = new File menu enable/disable flags.
  80.             newEditMenuState = new Edit menu enable/disable flags.
  81.             newNewsMenuState = new News menu enable/disable flags.
  82.             newSearchMenuState = new Search menu enable/disable flags.
  83.             newSpecialMenuState = new Special menu enable/disable flags.
  84.             newWindMenuState = new Windows menu enable/disable flags.
  85. ----------------------------------------------------------------------------*/
  86.  
  87. void SetMenusTo (
  88.     Boolean newAppleMenuEnabled,
  89.     unsigned long newFileMenuState, 
  90.     unsigned long newEditMenuState,
  91.     unsigned long newNewsMenuState, 
  92.     unsigned long newSearchMenuState,
  93.     unsigned long newSpecialMenuState, 
  94.     unsigned long newWindMenuState)
  95. {
  96.     Boolean r0,r1,r2,r3,r4,r5,r6;
  97.     static Boolean appleMenuEnabled = false;
  98.     static unsigned long fileMenuState = 0;
  99.     static unsigned long editMenuState = 0;
  100.     static unsigned long newsMenuState = 0;
  101.     static unsigned long searchMenuState = 0;
  102.     static unsigned long specialMenuState = 0;
  103.     static unsigned long windMenuState = 0;
  104.     
  105.     r0 = newAppleMenuEnabled != appleMenuEnabled;
  106.     if (r0) {
  107.         if (newAppleMenuEnabled) {
  108.             EnableItem(GetMHandle(kAppleMenu), 0);
  109.         } else {
  110.             DisableItem(GetMHandle(kAppleMenu), 0);
  111.         }
  112.         appleMenuEnabled = newAppleMenuEnabled;
  113.     }
  114.     r1 = AdjustOneMenu(kFileMenu, kNumFileMenuItems, &fileMenuState, newFileMenuState);
  115.     r2 = AdjustOneMenu(kEditMenu, kNumEditMenuItems, &editMenuState, newEditMenuState);
  116.     r3 = AdjustOneMenu(kNewsMenu, kNumNewsMenuItems, &newsMenuState, newNewsMenuState);
  117.     r4 = AdjustOneMenu(kSearchMenu, kNumSearchMenuItems, &searchMenuState, newSearchMenuState);
  118.     r5 = AdjustOneMenu(kSpecialMenu, kNumSpecialMenuItems, &specialMenuState, newSpecialMenuState);
  119.     r6 = AdjustOneMenu(kWindMenu, kNumWindMenuItems, &windMenuState, newWindMenuState);
  120.     if (r0 || r1 || r2 || r3 || r4 || r5 || r6) DrawMenuBar();
  121. }
  122.     
  123.  
  124.  
  125. /*----------------------------------------------------------------------------
  126.     AdjustMenus
  127.     
  128.     Enables and disables menus and commands based on which kind of window
  129.     is active.
  130. ----------------------------------------------------------------------------*/
  131.  
  132. void AdjustMenus (void)
  133. {
  134.     WindowPtr wind;
  135.     TWindow **info;
  136.     EWindowKind kind;
  137.     
  138.     if (gInBackground) return;
  139.     wind = FrontWindow();
  140.     if (IsDAWindow(wind)) {
  141.         SetMenusTo(true, kDAFileEnabled, kDAEditEnabled, 
  142.             kDANewsEnabled, kDASearchEnabled, 
  143.             kDASpecialEnabled,kDAWindEnabled);
  144.     } else if (!gStartupOK) {
  145.         SetMenusTo(true, kStartupBadFileEnabled, kStartupBadEditEnabled,
  146.             kStartupBadNewsEnabled, kStartupBadSearchEnabled, 
  147.             kStartupBadSpecialEnabled, kStartupBadWindEnabled);
  148.     } else if (wind == nil) {
  149.         SetMenusTo(true, kNoneFileEnabled, kNoneEditEnabled, 
  150.             kNoneNewsEnabled, kNoneSearchEnabled, 
  151.             kNoneSpecialEnabled, kNoneWindEnabled);
  152.     } else {
  153.         info = (TWindow**)GetWRefCon(wind);
  154.         kind = (**info).kind;
  155.         switch (kind) {
  156.             case kFullGroup:
  157.                 SetMenusTo(true, kGroupFileEnabled, kGroupEditEnabled, 
  158.                     kGroupNewsEnabled, kGroupSearchEnabled, 
  159.                     kGroupSpecialEnabled, kGroupWindEnabled);
  160.                 break;
  161.             case kNewGroup:
  162.                 SetMenusTo(true, kNewGroupFileEnabled, kNewGroupEditEnabled, 
  163.                     kNewGroupNewsEnabled, kNewGroupSearchEnabled, 
  164.                     kNewGroupSpecialEnabled, kNewGroupWindEnabled);
  165.                 break;
  166.             case kUserGroup:
  167.                 SetMenusTo(true, kUserGroupFileEnabled, kUserGroupEditEnabled, 
  168.                     kUserGroupNewsEnabled, kUserGroupSearchEnabled, 
  169.                     kUserGroupSpecialEnabled, kUserGroupWindEnabled);
  170.                 break;
  171.             case kSubject:
  172.                 SetMenusTo(true, kSubjectFileEnabled, kSubjectEditEnabled, 
  173.                     kSubjectNewsEnabled, kSubjectSearchEnabled, 
  174.                     kSubjectSpecialEnabled, kSubjectWindEnabled);
  175.                 break;
  176.             case kArticle:
  177.                 SetMenusTo(true, kArticleFileEnabled, kArticleEditEnabled, 
  178.                     kArticleNewsEnabled, kArticleSearchEnabled, 
  179.                     kArticleSpecialEnabled, kArticleWindEnabled);
  180.                 break;
  181.             case kMiscArticle:
  182.                 SetMenusTo(true, kMiscArticleFileEnabled, kMiscArticleEditEnabled, 
  183.                     kMiscArticleNewsEnabled, kMiscArticleSearchEnabled, 
  184.                     kMiscArticleSpecialEnabled, kMiscArticleWindEnabled);
  185.                 break;
  186.             case kMailMessage:
  187.                 SetMenusTo(true, kMailMessageFileEnabled, kMailMessageEditEnabled, 
  188.                     kMailMessageNewsEnabled, kMailMessageSearchEnabled, 
  189.                     kMailMessageSpecialEnabled, kMailMessageWindEnabled);
  190.                 break;
  191.             case kPostMessage:
  192.                 SetMenusTo(true, kPostMessageFileEnabled, kPostMessageEditEnabled, 
  193.                     kPostMessageNewsEnabled, kPostMessageSearchEnabled, 
  194.                     kPostMessageSpecialEnabled, kPostMessageWindEnabled);
  195.                 break;
  196.         }
  197.         if (kind == kArticle || kind == kMiscArticle || kind == kPostMessage ||
  198.             kind == kMailMessage)
  199.         {
  200.             SetItem(GetMHandle(kEditMenu),kShowHideHeaderItem,
  201.                 (**info).headerShown ? "\pHide Header" : "\pShow Header");
  202.         }
  203.     }
  204. }
  205.